#include "ota_http_curl.h"
#include "curl/curl.h"
#include <stdlib.h>
#include <string.h>
#include <log.h>

/**
 *   @brief  curl回调函数
 *   @param  data  请求获得的数据
 *   @param  size  每次请求的数据大小
 *   @param  nmemb  每次请求的数据个数
 *   @param  clientp  自定义s数据容器
 * 
 *   把请求获得的数据 装配在容器中
 *   1  计算整个数据的大小  
 *   2  把容器强转 为response_body_t *
 *   3  把容器中的data 开辟空间 大小为 size * nmemb+1   加一个结束符
 *   4  把数据拷贝到容器中
 *   5  把数据大小写入容器len 中
 *   6  返回size * nmemb
 */
static size_t ota_http_curl_write_callback(char *data, size_t size, size_t nmemb, void *clientp)
{
	 //   1  计算整个数据的大小  
	  size_t size_all = size * nmemb;
 //   2  把容器强转 为response_body_t *
      response_body_t *response_body = (response_body_t *)clientp;
 //  3  把容器中的data 开辟空间 大小为 size * nmemb+1   加一个结束符
      response_body->data = malloc(size_all + 1);
 //  4  把数据拷贝到容器中
      memcpy(response_body->data, data, size_all);
	  response_body->data[size_all]='\0'; //结束符
 //  5  把数据大小写入容器len 中
	  response_body->len = size_all+1;
 //  6  返回size * nmemb
	     return size_all;
}

/**
 *   @brief  获取http响应体
 *   @param  url  请求url
 *   @return  response_body_t *
 * 
 * //1  初始化一个curl 
 * //2  给curl 设置参数 1  url  2  接收数据的回调函数  3 接收数据的容器
 * //3  执行curl 
 * //4  获取响应体
 * //5  释放资源curl 
 * //6  返回响应体
 */

 response_body_t *ota_http_curl_get_response(char *url )
 {
   //1  初始化一个curl 
   CURL *curl = curl_easy_init();
   if (curl==NULL)
   {
		perror("curl_easy_init error");
		return NULL;
   }
   //2  给curl 设置参数 1  url  2  接收数据的回调函数  3 接收数据的容器
   curl_easy_setopt(curl, CURLOPT_URL, url);
   curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ota_http_curl_write_callback);

   response_body_t *response_body = malloc(sizeof(response_body_t));
   curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)response_body);
   //3  执行curl 
    
  CURLcode res= curl_easy_perform(curl);
  if (res != CURLE_OK)
  {
      perror("curl_easy_perform error");
      return NULL;
  }
	 
  //4  释放资源curl 
  curl_easy_cleanup(curl);
  //5 返回响应体

	return response_body;

 }


  int ota_http_curl_download(char *url ,char *file_path)
  {

  //1  初始化一个curl 
   CURL *curl = curl_easy_init();
   if (curl==NULL)
   {
		perror("curl_easy_init error");
		return -1;
   }
   //2  给curl 设置参数 1  url  2  接收数据的回调函数  3 接收数据的容器
   curl_easy_setopt(curl, CURLOPT_URL, url);
   curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);

   FILE *file= fopen(file_path,"wb");
   curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)file);
   //3  执行curl 
    
  CURLcode res= curl_easy_perform(curl);
  if (res != CURLE_OK)
  {
      perror("curl_easy_perform error");
      return -1;
  }
	 
  //4  释放资源curl 
  curl_easy_cleanup(curl);
  fclose(file); //重要
  //5 返回响应体
	return 0;


  }